package com.triadsystems.cashweb.modelo.negocio.servicos.impl;

import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import com.icon.infra.modelo.negocio.excecoes.ConsultaInvalidaException;
import com.icon.infra.modelo.negocio.excecoes.MultiplosResultadosParaRecuperarObjetoException;
import com.icon.infra.modelo.negocio.excecoes.ObjetoNaoEncontradoException;
import com.icon.infra.modelo.persistencia.dao.impl.DAOHibernateTemplate;
import com.triadsystems.cashweb.modelo.negocio.servicos.IMovimentacaoServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.IPagamentoServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.ITransacaoServico;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Movimentacao;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Pagamento;
import com.triadsystems.cashweb.modelo.persistencia.entidades.TransacaoPagamento;

@SuppressWarnings("unchecked")
@Named
public class TransacaoServico extends DAOHibernateTemplate<TransacaoPagamento> implements ITransacaoServico {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public TransacaoPagamento getTransacaoPagamentoByMovimentacao(Movimentacao movimentacao) 
			throws MultiplosResultadosParaRecuperarObjetoException, ObjetoNaoEncontradoException, ConsultaInvalidaException {
		TransacaoPagamento resultado = null;

		String stringHQL = "from TransacaoPagamento tp where "
				+ " tp.movimentacao =:movimentacao";

		String[] params = { "movimentacao" };
		Object[] valores = { movimentacao };

		resultado = (TransacaoPagamento) recuperarObjetoPorHQL(stringHQL, params, valores);
		return resultado;
	}
	@Inject
	private IPagamentoServico pagamentoServico;

	@Deprecated
	public Collection<Pagamento> getPagamentosByCodTransacao( Integer codTransacao) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		Collection<Pagamento> resultado = null;

		String stringHQL = "from Pagamento p "
				+ " where p.codTransacao =:codTransacao";

		String[] params = { "codTransacao" };
		Object[] valores = { codTransacao };

		resultado = pagamentoServico.recuperarObjetosPorHQL(stringHQL, params, valores);

		return resultado;
	}
	
	// Este metodo retorna apenas uma listagem de Pagamentos ativos
	//(ou seja.. apenas os que tem o indestorno diferente de 1 e sao do tipo Recebimento)
	@Deprecated
	public Collection<Pagamento> getPagamentosAtivosByCodTransacao(Integer codTransacao) throws ObjetoNaoEncontradoException, ConsultaInvalidaException{
		Collection<Pagamento> resultado = null;
		
		String stringHQL = "from Pagamento p "
			 +" where p.codTransacao = :codTransacao and p.indEstorno = :tipoRecebimento";
		String[] params = {"codTransacao", "tipoRecebimento"};
		Object[] valores = {codTransacao, 0};

		resultado = pagamentoServico.recuperarObjetosPorHQL(stringHQL, params, valores);
		
		return resultado;
	}

	@Inject
	private IMovimentacaoServico movimentacaoServico;
	
	@Deprecated
	public List<Movimentacao> getMovimentacoesByPagamento(Pagamento pagamento) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		int codTransacao = pagamento.getTransacaoPagamento().getCodigoTransacao();

		String stringHQL = "select c.movimentacao from TransacaoPagamento c"
				+ " where c.codTransacao =:codTransacao";

		String[] params = { "codTransacao" };
		Object[] valores = { codTransacao };

		List<Movimentacao> r = movimentacaoServico.recuperarObjetosPorHQL(
				stringHQL, params, valores, false);

		return r;
	}
	
	
	public TransacaoPagamento getTransacaoPagamentoById(long idMovimentacao) throws MultiplosResultadosParaRecuperarObjetoException, ObjetoNaoEncontradoException, ConsultaInvalidaException {
		TransacaoPagamento resultado = new TransacaoPagamento();

		String stringHQL = "from TransacaoPagamento tp where "
				+ " tp.movimentacao.id =:movimentacao";

		String[] params = { "movimentacao" };
		Object[] valores = { idMovimentacao };

		resultado = (TransacaoPagamento) recuperarObjetoPorHQL(stringHQL, params, valores);
		
		System.out.println(resultado.getEntityId());
		
		return resultado;
	}

	@Override
	public Collection<Pagamento> getPagamentosByCodTransacao(long codTransacao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Deprecated
	@Override
	public Collection<Pagamento> getPagamentosAtivosByCodTransacao(
			long codTransacao) {
		// TODO Auto-generated method stub
		return null;
	}

	// @SuppressWarnings({ "rawtypes", "unchecked" })
	// public Collection getParametrosByMovimentacao(TransacaoPagamento
	// transacaoPagamento, Movimentacao movimentacao) {
	// Collection<Pagamento> resultado = null;
	//
	// String stringHQL = "from Pagamento p where " +
	// " p.codTransacao = :transacaoPagamento.codTransacao" +
	// " and transacaoPagamento.movimentacao =:movimentacao";
	//
	// String[] params = {"transacaoPagamento", "movimentacao"};
	// Object[] valores = {transacaoPagamento, movimentacao};
	//
	// resultado = recuperarObjetosPorHQL(stringHQL, params, valores);
	//
	// return resultado;
	// }

	// @SuppressWarnings({ "rawtypes", "unchecked" })
	// public Collection getPagamentosByMovimentacao(Movimentacao movimentacao)
	// {
	// String stringHQL ="select c.pagamento from TransacaoPagamento c" +
	// " where c.movimentacao = :movimentacao";
	//
	// String[] params = { "movimentacao" };
	// Object[] valores = { movimentacao };
	//
	// Collection<Pagamento> recuperarObjetosPorHQL =
	// recuperarObjetosPorHQL(stringHQL, params, valores);
	//
	// return recuperarObjetosPorHQL;
	// }

	/*
	 * public Collection getMovimentacoesMesmaTransacao(Movimentacao m) { String
	 * hql ="from TransacaoPagamento c" + " where c.movimentacao = :mov";
	 * 
	 * String[] params = { "mov" }; Object[] valores = { m };
	 * 
	 * Collection<Movimentacao> recuperarObjetosPorHQL =
	 * recuperarObjetosPorHQL(hql, params, valores); return
	 * recuperarObjetosPorHQL; }
	 */

}
